/*
    尝试使用单例模式来实现。保持全局唯一的对象，将小车的一系列操作集成在一起，最后在main函数调用对象操作完成。
*/

#ifndef SINGLETON_H
#define SINGLETON_H

#include <iostream>
#include <vector>
#include "./car.h"
#include "./student.h"
#include <random>
#include <ctime>
#include <sstream>
#include <map>
#include <algorithm> 

class CarAllocationSystem
{
private:
    const int count = 10;
    const std::string fileName = "./data/info.csv";
    std::vector<Car> cars;
    std::vector<Student> students;
    /*
        在实践1里面用的carToStu，方便从小车检索到使用者，这次换一下，换成学生对小车，
        方便第一列的学号顺序输出，让第一列有序一点。
    */
    std::map<int, int> stuToCar;

public:
    static CarAllocationSystem &getInstance()
    {
        // Meyers' Singleton
        static CarAllocationSystem m_instance; // 局部静态变量
        return m_instance;
    }
    // 将其他构造函数设置为delete。避免对象被再次构造或者拷贝。
    CarAllocationSystem(const CarAllocationSystem &other) = delete;
    CarAllocationSystem &operator=(const CarAllocationSystem &other) = delete;

    /*
        系统需要实现的功能
    */
    void car_init();
    void stu_init();
    void allocate();
    void write();
    void read();

    // 测试
    void test();

protected:
    CarAllocationSystem() = default;
    ~CarAllocationSystem() = default;
};

#endif